iT邦幫忙

2021 iThome 鐵人賽

DAY 27
1
自我挑戰組

從HTML到Python爬蟲的30天之旅系列 第 27

Day 27:專案07 - 天氣小助理01 | 氣象資料API

  • 分享至 

  • xImage
  •  

圖片來源:https://www.epochtimes.com/b5/18/1/5/n10026856.htm

我先來講個故事吧~ 故事的主角小明,今年30歲單身,一個人住在租的套房裡,每天工作加班累的半死,回家馬上倒頭就睡,隔天早上起來又急急忙忙出門上班了,根本沒有時間看明天的天氣預報。

一直以來都沒有什麼問題,直到某一天發生一件不幸的事,小明下班時外面下著大雨,自己也沒有帶傘,一查才發現原來今天的下雨機率高達90%!! 小明此時覺得很氣惱,心想:如果有人可以在出門前提醒我帶傘就好了...。

於是他將煩惱告訴了他的好友,也就是你,身為工程師的你很同情他,沒有女朋友已經很可憐了,竟然還要淋雨回家,因此你決定寫一個程式來幫助小明!!

專案構想

小明的需求是每天早上出門前自動通知天氣資訊,因此專案的架構會長這樣:每天早上6點執行Python程式,由程式取得氣象資料後,經過一些處理後,再推送訊息給小明。那因為LINE是我們很常用的通訊軟體,所以就使用LINE Notify推送訊息給小明,如此一來小明只要早上看LINE就知道今天的天氣資訊了!

氣象資料API

首先,專案最重要的東西就是氣象資料,而且要每天更新,又有涵蓋很多地區。好消息是,中央氣象局提供的氣象資料API就有這些特點,我們就是要使用這個。

打開中央氣象局氣象資訊API文件,底下列出非常多API,而我們要用的是第一個(一般天氣預報-今明 36 小時天氣預報)。

點開後,可以看到API的所有參數,其中「Authorization」這一項是必填的,這是開放資料平台會員的授權碼,要有這個授權碼才能使用API,接著就要來講怎麼取得這個授權碼。

會員授權碼

  1. 先到中央氣象局網站註冊一個新會員,點擊「加入會員」,填寫一些基本資料後就可以成為會員了,請記住自己的帳號密碼。

  1. 再來到氣象開放資料平台,登入你剛才註冊的帳號。

  1. 登入後,點擊「取得授權碼」,將出現的授權碼記下來。

  1. 接著就可以用這個授權碼去使用API了!

解析API

回到剛才的中央氣象局氣象資訊API文件,點API右上方「Try it out」按鈕來測試API。

將授權碼填上去,底下參數基本上預設值就好,特別需要改的是「locationName」這個參數,選擇你所在的縣市。

按下「Execute」,下方就會顯示回傳結果,回傳的結果是JSON格式的字串。

根據這份文件來觀察回傳的JSON字串,就可以知道各個欄位所代表的含意。我們發現到 weatherElement 這個列表中存著天氣資訊,而每筆天氣資訊的第一筆是離現在最近12小時的資料(因為我們是每天早上6點抓取資料,所以第一筆資料就是當天6點到18點的資料,正是我們需要的)。

解析API的程式碼如下,為了方便測試特別寫成函數。

def get_data():

    url = "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001"
    params = {
        "Authorization": "你的API授權碼",
        "locationName": "你的城市",
    }

    response = requests.get(url, params=params)
    print(response.status_code)

    if response.status_code == 200:
        # print(response.text)
        data = json.loads(response.text)

        location = data["records"]["location"][0]["locationName"]

        weather_elements = data["records"]["location"][0]["weatherElement"]
        start_time = weather_elements[0]["time"][0]["startTime"]
        end_time = weather_elements[0]["time"][0]["endTime"]
        weather_state = weather_elements[0]["time"][0]["parameter"]["parameterName"]
        rain_prob = weather_elements[1]["time"][0]["parameter"]["parameterName"]
        min_tem = weather_elements[2]["time"][0]["parameter"]["parameterName"]
        comfort = weather_elements[3]["time"][0]["parameter"]["parameterName"]
        max_tem = weather_elements[4]["time"][0]["parameter"]["parameterName"]

        print(location)
        print(start_time)
        print(end_time)
        print(weather_state)
        print(rain_prob)
        print(min_tem)
        print(comfort)
        print(max_tem)

    else:
        print("Can't get data!")

執行結果:

200
臺中市
2021-09-30 18:00:00
2021-10-01 06:00:00
晴時多雲
20
27
舒適至悶熱
31

小結

今天順利地取得氣象資料了,明天就透過LINE Notify傳送訊息吧!


如果喜歡這系列文章麻煩幫我按Like加訂閱,你的支持是我創作最大的動力~

本系列文章以及範例程式碼都同步更新在GitHub上,後續會持續的更新,如果喜歡也麻煩幫我按個星星吧~

有任何問題或建議,都歡迎在底下留言區提出,還請大家多多指教。


上一篇
Day 26:專案06 - 股市趨勢圖03 | Matplotlib、Pandas繪圖
下一篇
Day 28:專案07 - 天氣小助理02 | LINE Notify
系列文
從HTML到Python爬蟲的30天之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
webberseawatch
iT邦新手 5 級 ‧ 2023-06-13 09:29:44

我複製了您的code,為何執行卻沒有任何反應

我也不知道?可能的原因太多了

我要留言

立即登入留言